﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using vudu.Logica.Clases;

namespace vudu.EnlaceDatos.SqlServer
{
    public class SqlServerProfesor
    {
        Conexion conex = new Conexion();

        //Funcion que devuelve una lista ocn la info de Profesor

        public List<Profesor> ConsultarTodosLosProfesores()
        {
            List<Profesor> listaProfe = new List<Profesor>();

            SqlCommand command = new SqlCommand();

            conex.AbrirConexionBd();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM PROFESOR ORDER BY apellidoProfesor";
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Profesor profe = new Profesor();
                profe.Cedula = reader.GetInt32(0);
                profe.Nombre = reader["nombreProfesor"].ToString();
                profe.Apellido = reader["apellidoProfesor"].ToString();
                profe.Crn = reader.GetInt32(3);
                profe.Email = reader["emailProfesor"].ToString();
                profe.FechaNacimiento = reader.GetDateTime(5);
                profe.Sexo = reader["sexoProfesor"].ToString();
                profe.Telefono = reader["telefonoProfesor"].ToString();
                profe.TiempoLaboral = reader["contratoProfesor"].ToString();
                profe.Estatus = reader["estadoProfesor"].ToString();
                profe.EspacioMaxCarga = reader.GetInt32(10);
                profe.EspacioUtilizado = reader.GetInt32(11);


                listaProfe.Add(profe);

            }
            reader.Close();
            conex.CerrarConexionBd();
            return listaProfe;
        }

        public List<Profesor> ConsultarTodosLosProfesoresDeEscuela(string miEscuela)
        {
            List<Profesor> listaProfe = new List<Profesor>();

            SqlCommand command = new SqlCommand();

            conex.AbrirConexionBd();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT DISTINCT Profesor.* FROM Escuela INNER JOIN EscuelaProfesor ON ";
            command.CommandText = command.CommandText + miEscuela + " = EscuelaProfesor.fk_Escuela INNER JOIN Profesor ON EscuelaProfesor.fk_Profesor ";
            command.CommandText = command.CommandText + "= Profesor.id_Cedula";
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Profesor profe = new Profesor();
                profe.Cedula = reader.GetInt32(0);
                profe.Nombre = reader["nombreProfesor"].ToString();
                profe.Apellido = reader["apellidoProfesor"].ToString();
                profe.Crn = reader.GetInt32(3);
                profe.Email = reader["emailProfesor"].ToString();
                profe.FechaNacimiento = reader.GetDateTime(5);
                profe.Sexo = reader["sexoProfesor"].ToString();
                profe.Telefono = reader["telefonoProfesor"].ToString();
                profe.TiempoLaboral = reader["contratoProfesor"].ToString();
                profe.Estatus = reader["estadoProfesor"].ToString();
                profe.EspacioMaxCarga = reader.GetInt32(10);
                profe.EspacioUtilizado = reader.GetInt32(11);


                listaProfe.Add(profe);

            }
            reader.Close();
            conex.CerrarConexionBd();
            return listaProfe;
        }

        public List<Profesor> ConsultarListaProfesores()
        {
            List<Profesor> listaProfe = new List<Profesor>();

            SqlCommand command = new SqlCommand();

            conex.AbrirConexionBd();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT id_cedula as cedula, nombreProfesor as Nombre, apellidoProfesor as Apellido  FROM PROFESOR";
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Profesor profe = new Profesor();
                profe.Cedula = reader.GetInt32(0);
                profe.Nombre = reader["Nombre"].ToString();
                profe.Apellido = reader["Apellido"].ToString();
                /*profe.Sexo = reader["sexoProfesor"].ToString();
                profe.Telefono = reader["telefonoProfesor"].ToString();
                profe.FechaNacimiento = reader.GetDateTime(6);
                profe.Estatus = reader["estadoProfesor"].ToString();
                profe.TiempoLaboral = reader["contratoProfesor"].ToString();
                //estos dos atributos agregar a la bd! para armar el objeto
                profe.EspacioMaxCarga = reader.GetInt32(11);
                profe.EspacioUtilizado = reader.GetInt32(12);
                */
                listaProfe.Add(profe);

            }
            reader.Close();
            conex.CerrarConexionBd();
            return listaProfe;
        }

        public Profesor ConsultarProfesor(String codigo, int tipoConsulta)
        {

            //esta funcion devuelve el profesor que se desea consultar, si tipo de consulta es 1 consulta por nombre
            //si es 2 consulta por cedula, el codigo que es un string debe coincidir con la seleccion de tipoConsulta
            //si se consulta por nombre codigo debe tener un nombre si se consulta por cedula debe tener una cedula
            Profesor profesor = new Profesor();
            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            if (tipoConsulta == 1)
                command.CommandText = "SELECT * FROM PROFESOR P WHERE P.nombreProfesor = '" + codigo + "'";
            else if (tipoConsulta == 2)
                command.CommandText = "SELECT * FROM PROFESOR P WHERE P.id_Cedula = " + codigo;
            else
                return null;
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Profesor profe = new Profesor();
                    profe.Cedula = reader.GetInt32(0);
                    profe.Nombre = reader["nombreProfesor"].ToString();
                    profe.Apellido = reader["apellidoProfesor"].ToString();
                    profe.Crn = reader.GetInt32(3);
                    profe.Email = reader["emailProfesor"].ToString();
                    profe.FechaNacimiento = reader.GetDateTime(5);
                    profe.Sexo = reader["sexoProfesor"].ToString();
                    profe.Telefono = reader["telefonoProfesor"].ToString();
                    profe.TiempoLaboral = reader["contratoProfesor"].ToString();
                    profe.Estatus = reader["estadoProfesor"].ToString();
                    profe.EspacioMaxCarga = reader.GetInt32(10);
                    profe.EspacioUtilizado = reader.GetInt32(11);
                    profesor = profe;
                }
                reader.Close();
                return profesor;
            }
            catch (SqlException ex)
            {
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public Profesor ConsultarPorMateriaProfesor(String codigo,string miEscuela)
        {

            //esta funcion devuelve el profesor que se desea consultar, si tipo de consulta es 1 consulta por nombre
            //si es 2 consulta por cedula, el codigo que es un string debe coincidir con la seleccion de tipoConsulta
            //si se consulta por nombre codigo debe tener un nombre si se consulta por cedula debe tener una cedula
            Profesor profesor = new Profesor();
            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
           
                /*command.CommandText = "SELECT Profesor.* FROM SeccionMateria INNER JOIN ";
                command.CommandText = command.CommandText + "Profesor ON SeccionMateria.fk_Profesor = Profesor.id_Cedula INNER JOIN ";
                command.CommandText = command.CommandText + "Materia ON SeccionMateria.fk_Materia = "+codigo;
                */

            command.CommandText = "SELECT Profesor.* FROM Escuela INNER JOIN ";
            command.CommandText = command.CommandText + "EscuelaProfesor ON "+miEscuela+" = EscuelaProfesor.fk_Escuela INNER JOIN ";
            command.CommandText = command.CommandText + "Profesor ON EscuelaProfesor.fk_Profesor = Profesor.id_Cedula INNER JOIN ";
            command.CommandText = command.CommandText + "SeccionMateria ON Profesor.id_Cedula = SeccionMateria.fk_Profesor INNER JOIN ";
            command.CommandText = command.CommandText + "Materia ON SeccionMateria.fk_Materia = "+codigo;
        
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Profesor profe = new Profesor();
                    profe.Cedula = reader.GetInt32(0);
                    profe.Nombre = reader["nombreProfesor"].ToString();
                    profe.Apellido = reader["apellidoProfesor"].ToString();
                    profe.Crn = reader.GetInt32(3);
                    profe.Email = reader["emailProfesor"].ToString();
                    profe.FechaNacimiento = reader.GetDateTime(5);
                    profe.Sexo = reader["sexoProfesor"].ToString();
                    profe.Telefono = reader["telefonoProfesor"].ToString();
                    profe.TiempoLaboral = reader["contratoProfesor"].ToString();
                    profe.Estatus = reader["estadoProfesor"].ToString();
                    profe.EspacioMaxCarga = reader.GetInt32(10);
                    profe.EspacioUtilizado = reader.GetInt32(11);
                    profesor = profe;
                }
                reader.Close();
                return profesor;
            }
            catch (SqlException ex)
            {
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool AgregarProfesorEscuela(string values)
        {
            SqlCommand comando = new SqlCommand();
            String sql = "INSERT INTO Escuela_Profesor(fechaInicio,fechaFin,cargo,fk_id_escuela,fk_id_profesor) ";
            sql = sql + "VALUES "+values;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                return true;
            }
            catch (SqlException ex)
            {
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool AgregarProfesor(string values)
        {
            SqlCommand comando = new SqlCommand();
            String sql = "INSERT INTO Profesor(id_cedula,nombreProfesor,apellidoProfesor,crnProfesor,fechaNac,sexoProfesor,";
            sql = sql + "telefonoProfesor,contratoProfesor,estadoProfesor,espacioMaxCarga,espacioUtilizado)";
            sql = sql + "VALUES " + values;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                return true;
            }
            catch (SqlException ex)
            {
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool agregarProfesor(string values)
        {
            SqlCommand comando = new SqlCommand();
            String sql = "INSERT INTO Profesor(id_cedula,nombreProfesor,apellidoProfesor,crnProfesor,fechaNac,sexoProfesor,";
            sql = sql + "telefonoProfesor,contratoProfesor,estadoProfesor,espacioMaxCarga,espacioUtilizado,emailProfesor)";
            sql = sql + "VALUES " + values;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                return false;
            }
            catch (Exception)
            {
                return true;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool eliminarProfesor(string cedula)
        {
            SqlCommand comando = new SqlCommand();
            String sql = "DELETE FROM Profesor WHERE id_cedula = "+cedula;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool ModificarProfesor(Profesor miProfesor,string miFecha)
        {
            

            SqlCommand comando = new SqlCommand();
            String sql = "UPDATE Profesor SET nombreProfesor='"+miProfesor.Nombre+"', apellidoProfesor='"+miProfesor.Apellido+"', emailProfesor='";
            sql = sql + miProfesor.Email + "',contratoProfesor='"+miProfesor.TiempoLaboral+"',fechaNac ='"+miFecha;
            sql = sql + "',telefonoProfesor='"+miProfesor.Telefono+"',sexoProfesor='"+miProfesor.Sexo+"',estadoProfesor='"+miProfesor.Estatus;
            sql = sql + "' WHERE id_Cedula="+miProfesor.Cedula;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();                
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                conex.CerrarConexionBd();
            }

            return true;
        }

        public bool inactivarProfesor(Profesor miProfesor)
        {


            SqlCommand comando = new SqlCommand();
            String sql = "UPDATE Profesor SET estadoProfesor='Inactivo' ";
            sql = sql + "WHERE id_Cedula=" + miProfesor.Cedula;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                conex.CerrarConexionBd();
            }

            return true;
        }

        public List<Profesor> ConsultarProfesoresActivos(string miEscuela)
        {
            List<Profesor> listaProfe = new List<Profesor>();

            SqlCommand command = new SqlCommand();

            conex.AbrirConexionBd();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT DISTINCT Profesor.* FROM Escuela INNER JOIN EscuelaProfesor ON ";
            command.CommandText = command.CommandText + miEscuela + " = EscuelaProfesor.fk_Escuela INNER JOIN Profesor ON EscuelaProfesor.fk_Profesor ";
            command.CommandText = command.CommandText + "= Profesor.id_Cedula ";
            command.CommandText = command.CommandText + "WHERE (Profesor.estadoProfesor = 'Activo')";
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Profesor profe = new Profesor();
                profe.Cedula = reader.GetInt32(0);
                profe.Nombre = reader["nombreProfesor"].ToString();
                profe.Apellido = reader["apellidoProfesor"].ToString();
                profe.Crn = reader.GetInt32(3);
                profe.Email = reader["emailProfesor"].ToString();
                profe.FechaNacimiento = reader.GetDateTime(5);
                profe.Sexo = reader["sexoProfesor"].ToString();
                profe.Telefono = reader["telefonoProfesor"].ToString();
                profe.TiempoLaboral = reader["contratoProfesor"].ToString();
                profe.Estatus = reader["estadoProfesor"].ToString();
                profe.EspacioMaxCarga = reader.GetInt32(10);
                profe.EspacioUtilizado = reader.GetInt32(11);


                listaProfe.Add(profe);

            }
            reader.Close();
            conex.CerrarConexionBd();
            return listaProfe;
        }

        public Universidad ConsultarMiUniversidad(String id_Universidad)
        {

            
            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT id_Universidad, nombre FROM Universidad WHERE id_Universidad = " + id_Universidad;        
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    Universidad miUniversidad = new Universidad();
                    miUniversidad.IdUniv = reader.GetInt32(0);
                    miUniversidad.Nombre = reader["nombre"].ToString();
                    return miUniversidad;
                }
                reader.Close();
                return null;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public List<Profesor> ConsultarProfesorUniversidad(String id_Universidad)
        {

            Profesor miProfesor = new Profesor();
            List<Profesor> misProfesores = new List<Profesor>();
            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT DISTINCT Profesor.* FROM Universidad ";
            command.CommandText = command.CommandText + " INNER JOIN Escuela ON Universidad.id_Universidad = Escuela.fk_Universidad INNER ";
            command.CommandText = command.CommandText + "JOIN EscuelaProfesor ON Escuela.id_Escuela = EscuelaProfesor.fk_Escuela INNER ";
            command.CommandText = command.CommandText + "JOIN Profesor ON EscuelaProfesor.fk_Profesor = Profesor.id_Cedula ";
            command.CommandText = command.CommandText + " WHERE (Universidad.id_Universidad = "+id_Universidad;
            command.CommandText = command.CommandText + ") ORDER BY Profesor.apellidoProfesor";
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Profesor profe = new Profesor();
                    profe.Cedula = reader.GetInt32(0);
                    profe.Nombre = reader["nombreProfesor"].ToString();
                    profe.Apellido = reader["apellidoProfesor"].ToString();
                    profe.Crn = reader.GetInt32(3);
                    profe.Email = reader["emailProfesor"].ToString();
                    profe.FechaNacimiento = reader.GetDateTime(5);
                    profe.Sexo = reader["sexoProfesor"].ToString();
                    profe.Telefono = reader["telefonoProfesor"].ToString();
                    profe.TiempoLaboral = reader["contratoProfesor"].ToString();
                    profe.Estatus = reader["estadoProfesor"].ToString();
                    profe.EspacioMaxCarga = reader.GetInt32(10);
                    profe.EspacioUtilizado = reader.GetInt32(11);

                    misProfesores.Add(profe);

                }

                reader.Close();
                return misProfesores;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public List<Escuela> ConsultarMisEscuelas(Profesor miProfesor)
        {

            List<Escuela> misEscuelas = new List<Escuela>();
            SqlCommand comando = new SqlCommand();            
            comando.CommandText = "SELECT Escuela.nombre FROM Profesor INNER JOIN EscuelaProfesor ON ";
            comando.CommandText = comando.CommandText +" Profesor.id_Cedula = EscuelaProfesor.fk_Profesor INNER JOIN ";
            comando.CommandText = comando.CommandText +" Escuela ON EscuelaProfesor.fk_Escuela = Escuela.id_Escuela ";
            comando.CommandText = comando.CommandText +" WHERE(Profesor.id_Cedula ="+ miProfesor.Cedula.ToString() +")";
            comando.CommandTimeout = 10;
            comando.Connection = conex.ObjetoConexion();

            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Escuela miEscuela = new Escuela();
                    miEscuela.NombreEscuela = reader["nombre"].ToString();
                    misEscuelas.Add(miEscuela);
                }
                
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }

            return misEscuelas;
        }

        public List<Materia> ConsultarMisMaterias(Profesor miProfesor)
        {

            List<Materia> misMaterias = new List<Materia>();
            SqlCommand comando = new SqlCommand();            
            comando.CommandText = "SELECT DISTINCT Materia.nombreMateria FROM Profesor INNER JOIN ";
            comando.CommandText = comando.CommandText +" SeccionMateria ON Profesor.id_Cedula = SeccionMateria.fk_Profesor INNER JOIN";
            comando.CommandText = comando.CommandText +" Materia ON SeccionMateria.fk_Materia = Materia.id_Materia";
            comando.CommandText = comando.CommandText + " WHERE (Profesor.id_Cedula = " + miProfesor.Cedula.ToString() +")";
            comando.CommandTimeout = 10;
            comando.Connection = conex.ObjetoConexion();

            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Materia miMateria = new Materia();
                    miMateria.Nombre = reader["nombreMateria"].ToString();
                    misMaterias.Add(miMateria);
                }
                
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }

            return misMaterias;
        }
    } 


}